#include <QApplication>     // 提供 Qt 应用程序的基础框架
#include <QTabWidget>       // 提供标签页控件 QTabWidget 的声明
#include <QWidget>          // 提供 QWidget 基类
#include <QLabel>           // 提供文本或图片显示组件 QLabel
#include <QPushButton>      // 提供按钮组件 QPushButton
#include <QVBoxLayout>      // 提供垂直布局管理器 QVBoxLayout
#include <QIcon>            // 提供图标显示支持
#include <QDebug>           // 提供调试输出支持（如 qDebug()）

int main(int argc, char *argv[]) {
    QApplication app(argc, argv); // 创建 QApplication 应用程序对象，管理主事件循环

    QWidget *mainWindow = new QWidget;         // 创建主窗口部件
    QVBoxLayout *mainLayout = new QVBoxLayout; // 创建垂直布局管理器，用于布置主窗口中的控件

    QTabWidget *tabWidget = new QTabWidget;    // 创建 QTabWidget 控件（用于管理多个选项卡页面）

    // ================== 设置标签栏外观属性 ==================
    tabWidget->setTabPosition(QTabWidget::North); // 设置标签栏位于顶部（可选：North、South、West、East）
    tabWidget->setTabsClosable(true);             // 设置每个标签可关闭（右上角带关闭按钮）
    tabWidget->setMovable(true);                  // 设置标签页可拖动改变顺序
    tabWidget->setIconSize(QSize(20, 20));        // 设置标签图标的显示尺寸

    // ================== 标签页 1：显示设置 ==================
    QWidget *displayTab = new QWidget;              // 创建标签页部件
    QVBoxLayout *displayLayout = new QVBoxLayout;   // 创建垂直布局
    displayLayout->addWidget(new QLabel("亮度、分辨率设置...")); // 添加一个标签内容
    displayTab->setLayout(displayLayout);           // 设置布局
    tabWidget->addTab(displayTab, QIcon(":/images/123.jpg"), "显示"); // 添加为选项卡，设置图标和标题

    // ================== 标签页 2：声音设置 ==================
    QWidget *soundTab = new QWidget;
    QVBoxLayout *soundLayout = new QVBoxLayout;
    soundLayout->addWidget(new QLabel("音量、麦克风设置...")); // 添加标签内容
    soundTab->setLayout(soundLayout);
    tabWidget->addTab(soundTab, QIcon(":/images/456.jpg"), "声音");

    // ================== 标签页 3：代码编辑页 ==================
    QWidget *codeTab = new QWidget;
    QVBoxLayout *codeLayout = new QVBoxLayout;
    codeLayout->addWidget(new QLabel("打开文件 A.cpp 的内容...")); // 模拟打开文件内容
    codeTab->setLayout(codeLayout);
    tabWidget->addTab(codeTab, QIcon(":/images/789.jpg"), "A.cpp");

    // ================== 标签页 4：删除当前页 ==================
    QWidget *deleteTab = new QWidget;
    QVBoxLayout *deleteLayout = new QVBoxLayout;
    QPushButton *deleteBtn = new QPushButton("删除当前标签页"); // 创建按钮
    deleteLayout->addWidget(new QLabel("点击按钮删除当前页")); // 添加说明文字
    deleteLayout->addWidget(deleteBtn);                        // 添加按钮
    deleteTab->setLayout(deleteLayout);                        // 设置布局
    tabWidget->addTab(deleteTab, "删除页");                    // 添加为标签页

    // ================== 信号槽连接：响应事件 ==================

    // 当标签页切换时触发，打印当前索引
    QObject::connect(tabWidget, &QTabWidget::currentChanged, [](int index) {
        qDebug() << "切换到了第" << index << "个标签页";
    });

    // 当用户点击关闭按钮时触发，移除对应的标签页
    QObject::connect(tabWidget, &QTabWidget::tabCloseRequested, [=](int index) {
        qDebug() << "关闭请求：" << index;
        tabWidget->removeTab(index); // 删除指定索引的标签页
    });

    // 点击按钮删除当前激活的标签页
    QObject::connect(deleteBtn, &QPushButton::clicked, [=]() {
        int idx = tabWidget->currentIndex(); // 获取当前激活的标签页索引
        if (idx >= 0) {
            tabWidget->removeTab(idx);       // 移除当前标签页
        }
    });

    // ================== 主窗口设置与显示 ==================
    mainLayout->addWidget(tabWidget);     // 将标签控件加入主布局
    mainWindow->setLayout(mainLayout);    // 设置主窗口布局
    mainWindow->resize(500, 300);         // 设置窗口大小
    mainWindow->setWindowTitle("QTabWidget 全功能示例"); // 设置窗口标题
    mainWindow->show();                   // 显示窗口

    return app.exec(); // 启动 Qt 主事件循环
}
